<?php

namespace app\admin\controller;

use app\admin\controller\BaseController;
use think\Request;
use think\Validate;

class Menu extends BaseController
{
    // 设置模型名称
    protected $modelName = 'menu';

    // 字段显示名称映射
    protected $fieldLabels = [
        'name' => '菜单名称'
    ];

    // 需要结合父ID进行唯一性检查的字段，由子类设置
    protected $uniqueWithParentFields = ['name'];

    // 父ID字段名，默认'pid'
    protected $parentIdField = 'pid';

    // 启用软删除
    protected $useSoftDelete = false;

    // 设置验证规则
    // 添加自定义string验证规则
    public function __construct()
    {
        parent::__construct();
        Validate::extend('string', function($value) {
            return is_string($value);
        }, '必须是字符串类型');
    }

    // 设置验证规则
    protected $validateRules = [
        'id' => 'number',
        'name' => 'require|max:10',
        'pid' => 'number',
        'sort' => 'number',
        'is_show' => 'require|in:0,1',
        'level' => 'number',
        'url' => 'string|max:50',
        'icon' => 'string|max:100'
    ];

    // 设置规则提示
    protected $validateRulesMsg = [
        'name.require' => '名称不能为空',
        'name.max' => '名称最多10个字符',
        'is_show.require' => '显示状态不能为空',
        'is_show.in' => '显示状态必须是0或1',
        'url.string' => '路由路径必须是字符串',
        'url.max' => '路由路径最多50个字符',
        'icon.string' => '图标必须是字符串',
        'icon.max' => '图标最多100个字符'
    ];


    /**
     * 菜单列表
     * 重写父类方法以自定义排序方式
     * */
    public function getList()
    {
        $list = $this->model->order('sort asc')->select();
        apiReturn(1, '获取数据成功', $list);
    }

    /**
     * 显示/隐藏 菜单
     * 自定义方法，父类中没有
     * */
    public function doIsShow()
    {
        $input = Request()->param();
        $id = $input['id'];
        $is_show = $input['is_show'];
        
        if (empty($id)) {
            apiReturn(2, '参数错误');
        }
        
        try {
            $data = [
                'is_show' => $is_show,
                'update_time' => time()
            ];
            $res = $this->model->where('id', $id)->update($data);
            if ($res !== false) {
                apiReturn(1, '操作成功');
            } else {
                apiReturn(2, '操作失败');
            }
        } catch (\Exception $e) {
            apiReturn(2, '操作失败: ' . $e->getMessage());
        }
    }
}
